package com.molichuxing.services.infrastructure.service;

import java.util.List;
import java.util.Map;

import com.molichuxing.framework.dto.Paged;
import com.molichuxing.framework.service.RootService;
import com.molichuxing.services.infrastructure.dto.request.create.StockCarCreateDto;
import com.molichuxing.services.infrastructure.dto.request.modify.StockCarModifyDto;
import com.molichuxing.services.infrastructure.dto.response.StockCarDownloadDto;
import com.molichuxing.services.infrastructure.dto.response.StockCarDto;

/**
 * 
 * @author liyg
 * 库存车辆服务
 * 2019-08-22
 *
 */
public interface StockCarService extends RootService{

	/**
	 * 获取库存信息
	 * 
	 * @param carId 
	 *           车辆id
	 * @return
	 */
	StockCarDto getStockCar(Integer carId);
	
	/**
	 * 获取库存信息（根据车辆id查询车辆入店时间）
	 * 
	 * @param carId 
	 *           车辆id
	 * @return
	 */
	StockCarDto getStorageTime(Integer carId);
	/**
	 * 获取库存信息
	 * 
	 * @param carId 
	 *           车辆id
	 * @param stockIds 
	 *           仓库ids
	 * @return
	 */
	StockCarDto getStockCar(Integer carId,List<Integer> stockIds);
	
	/**
	 * 获取库存车辆详情
	 * @param carIds
	 * @return
	 */
	List<StockCarDto> getStockCars(List<Integer> carIds);
	
	/**
	 * 判断该车是否在库
	 * 
	 * @param carId 
	 *           车辆id
	 * @return true：存在   false：不存在  
	 */
	Boolean getStockCarExist(Integer carId);
	
	/**
	 * 获取数量
	 * 
	 * @param status 
	 *            库存状态（1：待入库，2：已入库）
	 * @param inStockType
	 *            收车库类型（1：中转库，2：门店）  
	 * @return
	 */
	Long getCount(Integer status,Integer inStockType);
	
	/**
	 * 获取数量
	 * 
	 * @param status 
	 *            库存状态（1：待入库，2：已入库）
	 * @param inStockType
	 *            收车库类型（1：中转库，2：门店）  
	 * @param carIds
	 *            车辆ids
	 * @param type
	 *            入库类型（1：采购，2：调拨，3、拒收、4、收车）
	 * @return
	 */
	Long getCount(Integer status,Integer inStockType,List<Integer> carIds,Integer type);
	
	/**
	 *库存车辆列表
	 * @param map 参数
	 *key:carIds      List      车辆ids 非必填
	 *key:vehicleId  Integer 车型id 非必填
	 *key:status     Integer 库存状态 非必填
	 *key:type       Integer 出入库类型 非必填
	 *key:operationState Integer   运营状态 非必填
	 *key:inStockType  Integer 收车库类型 非必填
	 *key:stockId    Integer 中转库id 非必填
	 *key:startTime  LocalDateTime 开始时间 非必填
	 *key:endTime    LocalDateTime 结束时间 非必填
	 *key:sortName   String 排序字段 
	 *key:sortWay    String 排序方式 
	 *key:pageNum    Integer 当前页
	 *key:pageSize   Integer 每页显示条数
	 * @return
	 */
	Paged<StockCarDto> getStockCarList(Map<String,Object> map);
	
	/**
	 *库存车辆列表（经销商）
	 * @param map 参数
	 *key:carIds     List 车辆ids 非必填
	 *key:vehicleId  Integer 车型id 非必填
	 *key:stockId    Integer 仓库id 非必填
	 *key:stockIds   List 仓库ids
	 *key:sortName   String 排序字段 
	 *key:sortWay    String 排序方式 
	 *key:pageNum    Integer 当前页
	 *key:pageSize   Integer 每页显示条数
	 * @return
	 */
	Paged<StockCarDto> getDealerStockCarList(Map<String,Object> map);
	
	/**
	 *到期还车列表（经销商）
	 * @param map 参数
	 *key:carIds      List 车辆ids 非必填
	 *key:type        Integer 入库类型（1：采购，2：调拨，3、拒收、4、收车） 非必填
	 *key:status      Integer 库存状态（1：待入库，2：已入库） 非必填
	 *key:inStockType Integer 收车库类型（1：中转库，2：门店） 非必填
	 *key:sortName   String 排序字段 
	 *key:sortWay    String 排序方式 
	 *key:pageNum    Integer 当前页
	 *key:pageSize   Integer 每页显示条数
	 * @return
	 */
	Paged<StockCarDto> getReturnStockCarList(Map<String,Object> map);
	
	/**
	 * 保存库存信息
	 * 
	 * @param createDto
	 * @return
	 */
	Boolean create(StockCarCreateDto createDto);
	
	/**
	 * 修改库存信息
	 * 
	 * @param modifyDto
	 * @return
	 */
	Boolean modify(StockCarModifyDto modifyDto);
	
	/**
	 * 修改库存信息
	 * 
	 * @param modifyDto
	 * @return
	 */
	Boolean modifyStatus(StockCarModifyDto modifyDto);
	
	/**
	 * 修改库存信息
	 * 
	 * @param modifyDto
	 * @return
	 */
	Boolean modifyInStockId(StockCarModifyDto modifyDto);
	
	/**
	 * 修改车辆运营状态
	 * @param carId
	 * @param carStatus (0：待出租，1：已出租，2：不可租，3:已出售)
	 * @return
	 */
	Boolean modifyCarStatus(Integer carId,Integer carStatus);
	
	/**
	 * 修改车辆运营状态
	 * @param carId
	 * @param carStatus (0：待出租，1：已出租，2：不可租，3:已出售)
	 * @param fenceId 围栏id
	 * @return
	 */
	Boolean modifyCarStatusAndFenceId(Integer carId,Integer carStatus,Integer fenceId);

	/**
	 * 车辆调拨(修改库存信息 包含调拨说明)
	 * @param modifyDto
	 * @return
	 */
	Boolean modifyAllotStock(StockCarModifyDto modifyDto);

	/**
	 *库存车辆列表
	 * @param map 参数
	 *key:ids        List 仓库ids
	 *key:carId      Integer      车辆id 非必填
	 *key:vehicleId  Integer 车型id 非必填
	 *key:status     Integer 库存状态 非必填
	 *key:type       Integer 出入库类型 非必填
	 *key:operationState Integer   运营状态 非必填
	 *key:inStockType  Integer 收车库类型 非必填
	 *key:stockId    Integer 中转库id 非必填
	 *key:startTime  LocalDateTime 开始时间 非必填
	 *key:endTime    LocalDateTime 结束时间 非必填
	 * @return
	 */
	List<StockCarDownloadDto> getStockCarDownloadList(Map<String,Object> map);
	
	/**
	 * 查询库存车辆列表导出总条数
	 * @param map
	 * @return
	 */
	Long getStockCarDownloadListCount(Map<String,Object> map);
	
	/**
	 * 根据ids查询库存
	 * @param carIds
	 * @return
	 */
	List<StockCarDownloadDto> getByIds(List<Integer> carIds);

	/**
	 * 查询 待出租 并且 为已入库 的车辆
	 * @return
	 */
	List<StockCarDownloadDto> getStockListByStatus();
	
	/**
	 * 根据车辆id修改围栏id
	 * @param carId
	 * @param fenceId
	 * @return
	 */
	Boolean modifyFenceId(Integer carId,Integer fenceId);
}
